import { obj, effect, track, trigger } from "./index.js";

function computed(getter) {
  /* 用来缓存上一次计算的值 */
  let cacheValue;
  /* 用来标识是否需要重新计算值，为true则意味着“脏”，需要计算 */
  let dirty = true;

  const effectFn = effect(getter, {
    lazy: true,
    scheduler() {
      /* 设置obj.foo或obj.bar后将dirty设置为true，表示需要重新计算 */
      dirty = true;
      trigger(computeProperty, "value");
    },
  });

  const computeProperty = {
    get value() {
      /* 只有在数据脏的时候才进行计算，并将值缓存到value中 */
      if (dirty) {
        console.log("开始计算...");
        cacheValue = effectFn();
        /* dirty设置为false， 下一次直接返回缓存在value中的值 */
        dirty = false;
      }
      track(computeProperty, "value");
      return cacheValue;
    },
  };

  return computeProperty;
}

const sum = computed(() => obj.foo + obj.bar);

console.log(sum.value);

console.log(sum.value);

effect(() => {
  console.log(sum.value);
});

obj.foo++;
obj.foo++;
